const Koa = require("koa") // 【Koa基础】第一步：引入Koa

const { koaBody } = require("koa-body") // 引入

const cors = require("koa2-cors") // 解决跨域问题的中间件

const logger = require("koa-logger") // 日志中间件
const koaStatic = require("koa-static") // 静态文件服务的中间件

// 【koaJwt】第一步：引入
const koaJwt = require("koa-jwt") // 进行jwt校验的中间件，对前端传过来的token做校验

const db = require("../json-server/db")
const app = new Koa() // 【Koa基础】第二步：创建Koa对象

db.init() // 数据库初始化

// !!! 要尤其注意注册的先后顺序，跨域请求的中间件尽量放到比较靠前的位置去注册
app.use(cors())

// 【koaJwt】第二步：导入时加上配置项
app.use(
  koaJwt({
    secret: "2302B", // 代表加密解密时使用的密钥字符串
  }).unless({
    // 代表了白名单，对白名单中的路径，不做jwt的校验
    path: [/^\/user\/login/, /^\/user\/register/],
  })
)
// 访问接口的时候，koaJwt默认的带token的方式：
// 1. headers上面的Authorization字段上
// 2. 内容【Bearer 你自己的token】

app.use(logger()) // 给所有的请求带上log日志信息
// __dirname: nodejs提供的全局变量，代表了当前的路径
// http://localhost:8000/images/1.jpg
app.use(koaStatic(__dirname + "/public")) // 代表了静态文件目录

// 【Koa基础】第三步：app.use安装各种必要的中间件
// !!! 这一步最重要，Koa是轻量级的后台接口系统，各种功能都是通过中间件完成
app.use(koaBody())

// Koa中通过路由组件来维护不同的接口请求，每一个路由项都是一个核心的入口点
// 【KoaRouter】第一步：引入router库
const Router = require("@koa/router")

// 【KoaRouter】 第二步：创建router对象
const router = new Router()
// user本质上是一个router对象，在pages/use.js中创建的
const user = require("./routes/user")
const goods = require("./routes/goods")

//【KoaRouter】 第三步：使用router对象定义接口
// 定义方式：router.post、router.get、router.delete、router.patch对应HTTP的方法
// 第二个参数是回调函数，对应到接口的处理函数
router.post("/delstudents", async (ctx, next) => {
  // 解构body，拿到id
  // 根据id去数据库中进行删除操作
  const res = await db.delStudent(id)
  if (res) {
    ctx.body = {}
  }
  // 数据库操作完成后，返回给前端JSON数据
})

// 【KoaRouter】第四步：在App上注册（绑定）router
app.use(router.routes()).use(router.allowedMethods())
// user模块的路由
app.use(user.routes()).use(user.allowedMethods())
app.use(goods.routes()).use(goods.allowedMethods())

// 【Koa基础】第四步：监听某个端口，启动server
app.listen(8000)
